<template>
  <view class="uni-calendar">
    <view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}"
      @click="clean"></view>
    <view v-if="insert || show" class="uni-calendar__content"
      :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
      <view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
        <view class="uni-calendar__header-btn-box" @click="close">
          <text class="uni-calendar__header-text uni-calendar--fixed-width">{{cancelText}}</text>
        </view>
        <view class="uni-calendar__header-btn-box" @click="confirm">
          <text class="uni-calendar__header-text uni-calendar--fixed-width">{{okText}}</text>
        </view>
      </view>
      <view class="uni-calendar__header">
        <view class="uni-calendar__header-btn-box" @click.stop="pre">
          <view class="uni-calendar__header-btn uni-calendar--left"></view>
        </view>
        <picker mode="date" :value="date" fields="month" @change="bindDateChange">
          <text class="uni-calendar__header-text">{{ (nowDate.year||'') +' / '+( nowDate.month||'')}}</text>
        </picker>
        <view class="uni-calendar__header-btn-box" @click.stop="next">
          <view class="uni-calendar__header-btn uni-calendar--right"></view>
        </view>
        <text class="uni-calendar__backtoday" @click="backToday">{{todayText}}</text>

      </view>
      <view class="uni-calendar__box">
        <!-- <view v-if="showMonth" class="uni-calendar__box-bg">
					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
				</view> -->
        <view class="uni-calendar__weeks">

          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{monText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{THUText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{SATText}}</text>
          </view>
          <view class="uni-calendar__weeks-day">
            <text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
          </view>
        </view>
        <view v-for="(item,weekIndex) in weeks" :key="weekIndex">
          <view style="display: flex;flex-direction: column;">
            <view class="uni-calendar__weeks">
              <view class="uni-calendar__weeks-item" v-for="(day,dayIndex) in item.weeks" :key="dayIndex">
                <calendar-item class="uni-calendar-item--hook" :weeks="day" :calendar="calendar" :selected="selected"
                  :lunar="lunar" @change="choiceDate(item,day)"></calendar-item>
                <block v-if="!day.disable">
                  <!--领导端查询 -->
                  <view v-if="isScan" :data-scan-status="day.scanState" class="uni-calendar-item"
                    @click="datePlanClick(day,item)">
                    {{getScanDayStatus(day)}}
                  </view>
                  <view v-else :data-status="day.isHoliday ==1?'4':day.dayStatus" class="uni-calendar-item"
                    @click="datePlanClick(day,item)">
                    {{getDayStatus(day)}}
                  </view>
                </block>

              </view>
            </view>
            <block v-if="showPlane(item.weeks)">
              <!--领导端查询 -->
              <view class="plan-bg" v-if="isScan" :data-scan-status="item.scanState" @click="weekPlanClick(item)">
                {{getScanPlaneName(item)}}
              </view>
              <view class="plan-bg" v-else :data-status="item.dataState" @click="weekPlanClick(item)">
                {{getPlaneName(item)}}
              </view>
            </block>

          </view>

        </view>
      </view>
    </view>
  </view>
</template>

<script>
  import Calendar from './util.js';
  import CalendarItem from './tc-calendar-item.vue'

  import {
    initVueI18n
  } from '@dcloudio/uni-i18n'
  import i18nMessages from './i18n/index.js'

  const {
    t
  } = initVueI18n(i18nMessages)

  /**
   * Calendar 日历
   * @description 日历组件可以查看日期，选择任意范围内的日期，打点操作。常用场景如：酒店日期预订、火车机票选择购买日期、上下班打卡等
   * @tutorial https://ext.dcloud.net.cn/plugin?id=56
   * @property {String} date 自定义当前时间，默认为今天
   * @property {String} point.position [1, 2, 3, 4, 5, 6] 红点位置，[左上角, 右上角, 右下角, 左下角, 上中间, 下中间]
   * @property {String} point.color 红点背景色
   * @property {String} text.size 文字大小
   * @property {String} text.color 文字颜色
   * @property {Boolean} lunar 显示农历
   * @property {String} startDate 日期选择范围-开始日期
   * @property {String} endDate 日期选择范围-结束日期
   * @property {Boolean} range 范围选择
   * @property {Boolean} insert = [true|false] 插入模式,默认为false
   * 	@value true 弹窗模式
   * 	@value false 插入模式
   * @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
   * @property {Array} selected 打点，期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
   * @property {Boolean} showMonth 是否选择月份为背景
   * @event {Function} change 日期改变，`insert :ture` 时生效
   * @event {Function} confirm 确认选择`insert :false` 时生效
   * @event {Function} monthSwitch 切换月份时触发
   * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
   */
  export default {
    components: {
      CalendarItem
    },
    emits: ['close', 'confirm', 'change', 'monthSwitch', 'weekPlanClick', 'datePlanClick'],
    props: {
      date: {
        type: String,
        default: ''
      },
      selected: {
        type: Array,
        default () {
          return []
        }
      },
      lunar: {
        type: Boolean,
        default: false
      },
      startDate: {
        type: String,
        default: ''
      },
      endDate: {
        type: String,
        default: ''
      },
      range: {
        type: Boolean,
        default: false
      },
      insert: {
        type: Boolean,
        default: true
      },
      showMonth: {
        type: Boolean,
        default: true
      },
      clearDate: {
        type: Boolean,
        default: true
      },
      isScan: {
        type: Boolean,
        default: false
      }
    },
    data() {
      return {
        show: false,
        weeks: [],
        planList: [],
        calendar: {},
        nowDate: '',
        aniMaskShow: false
      }
    },
    computed: {
      /**
       * for i18n
       */

      okText() {
        return t("uni-calender.ok")
      },
      cancelText() {
        return t("uni-calender.cancel")
      },
      todayText() {
        return t("uni-calender.today")
      },
      monText() {
        return t("uni-calender.MON")
      },
      TUEText() {
        return t("uni-calender.TUE")
      },
      WEDText() {
        return t("uni-calender.WED")
      },
      THUText() {
        return t("uni-calender.THU")
      },
      FRIText() {
        return t("uni-calender.FRI")
      },
      SATText() {
        return t("uni-calender.SAT")
      },
      SUNText() {
        return t("uni-calender.SUN")
      },
    },
    watch: {
      date(newVal) {
        // this.cale.setDate(newVal)
        this.init(newVal)
      },
      startDate(val) {
        this.cale.resetSatrtDate(val)
        this.cale.setDate(this.nowDate.fullDate)
        this.weeks = this.cale.weeks
      },
      endDate(val) {
        this.cale.resetEndDate(val)
        this.cale.setDate(this.nowDate.fullDate)
        this.weeks = this.cale.weeks
      },
      selected(newVal) {
        this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
        this.weeks = this.cale.weeks
        console.log(this.weeks)
      },
      planList(newVal) {
        console.log(newVal)
        this.cale.setPlanList(this.nowDate.fullDate, newVal)
        this.weeks = this.cale.weeks
      }

    },
    created() {
      console.log(this.selected)
      console.log(this.startDate)
      this.cale = new Calendar({
        selected: this.selected,
        startDate: this.startDate,
        endDate: this.endDate,
        range: this.range,
      })
      this.init(this.date)
    },
    methods: {
      setPlanList(list) {
        this.planList = list
        console.log(this.planList)
      },
      //是否展示周计划
      showPlane(weeks) {
        let show = false
        weeks.forEach(item => {
          if (!item.disable) {
            show = true
          }
        })
        return show
      },
      // 取消穿透
      clean() {},
      bindDateChange(e) {
        const value = e.detail.value + '-1'
        this.setDate(value)

        const {
          year,
          month
        } = this.cale.getDate(value)
        this.$emit('monthSwitch', {
          year,
          month
        })
      },
      /**
       * 初始化日期显示
       * @param {Object} date
       */
      init(date) {
        this.cale.setDate(date)
        this.weeks = this.cale.weeks
        this.nowDate = this.calendar = this.cale.getInfo(date)
      },
      /**
       * 打开日历弹窗
       */
      open() {
        // 弹窗模式并且清理数据
        if (this.clearDate && !this.insert) {
          this.cale.cleanMultipleStatus()
          // this.cale.setDate(this.date)
          this.init(this.date)
        }
        this.show = true
        this.$nextTick(() => {
          setTimeout(() => {
            this.aniMaskShow = true
          }, 50)
        })
      },
      /**
       * 关闭日历弹窗
       */
      close() {
        this.aniMaskShow = false
        this.$nextTick(() => {
          setTimeout(() => {
            this.show = false
            this.$emit('close')
          }, 300)
        })
      },
      /**获取当前计划的状态
       * @param {Object} item
       * @param {Object} weekindex
       */
      getPlaneName(item) {

        var status = '' //默认未提交
        if (item.dataState != 'undefined') {
          if (item.dataState == 0) {
            status = '待审批'
          } else if (item.dataState == 1) {
            status = '审批通过'
          } else if (item.dataState == 2) {
            status = '审批驳回'
          }
        }
        return status;

      },
      /**获取当前计划的状态
       * @param {Object} item
       */
      getScanPlaneName(item) {
        if (!item.subUserNum) {
          return '未提交'
        }
        if (item.scanState == 2) {
          return '全部提交'
        } else if (item.scanState == 1) {
          return '部分提交'
        }
        return '未提交'

      },
      //获取每天的状态
      getDayStatus(day) {
        // console.log(day)
        var statusName = '未提交'
        if (day.isHoliday && day.isHoliday == 1) {
          statusName = "休假"
        } else {
          if (day.dayStatus == 0) {
            statusName = '未提交'
          } else if (day.dayStatus == 1) {
            statusName = '待审批'
          } else if (day.dayStatus == 2) {
            // statusName = '已通过'
            statusName = '查看'
          } else if (day.dayStatus == 3) {
            statusName = '已驳回'
          }
        }
        return statusName
      },
      /**
       * @param {Object} item 领导端查看 日状态
       */
      getScanDayStatus(item) {
        if (!item.subUserNum) {
          return '未提交'
        }
        if (item.scanState == 2) {
          return '全部提交'
        } else if (item.scanState == 1) {
          return '部分提交'
        }
        return '未提交'

      },
      /**
       * 周计划点击事件
       */
      weekPlanClick(item) {
        console.log(item)
        const weeks = item.weeks
        this.$emit('weekPlanClick', {
          coordinateHelp: item.coordinateHelp,
          weekWorkPlan: item.weekWorkPlan,
          workSummary: item.workSummary,
          dataState: item.dataState,
          attachIds: item.attachIds,
          // fileUrl: item.fileUrl,
          beginDate: weeks[0].fullDate,
          endDate: weeks[6].fullDate,
          planId: item.planId
        })

      },
      /**
       * 日报
       */
      datePlanClick(day, item) {
        console.log(item)
        this.$emit('datePlanClick', {
          ...day,
          planCode: item.planCode,
          dataState: item.dataState,
          beginDate: item.weeks[0].fullDate,
          endDate: item.weeks[6].fullDate
        })
      },
      /**
       * 确认按钮
       */
      confirm() {
        this.setEmit('confirm')
        this.close()
      },

      /**
       * 选择月份触发
       */
      monthSwitch() {
        let {
          year,
          month
        } = this.nowDate
        this.$emit('monthSwitch', {
          year,
          month: Number(month)
        })
      },
      /**
       * 派发事件
       * @param {Object} name
       */
      setEmit(name, data) {
        let {
          year,
          month,
          date,
          fullDate,
          lunar,
          extraInfo
        } = this.calendar
        this.$emit(name, {
          range: this.cale.multipleStatus,
          year,
          month,
          date,
          fulldate: fullDate,
          lunar,
          extraInfo: extraInfo || {},
          ...data
        })
      },
      /**
       * 变化触发
       */
      change(data) {
        console.log(data)
        if (!this.insert) return
        this.setEmit('change', data)
      },
      /**
       * 选择天触发
       * @param {Object} weeks
       * @param {Object} day
       */
      choiceDate(weeks, day) {
        // console.log(weeks)
        // console.log(day)
        if (day.disable) return
        this.calendar = day
        // 设置多选
        this.cale.setMultiple(this.calendar.fullDate)
        this.weeks = this.cale.weeks
        this.change({
          subUserNum: weeks.subUserNum,
          planCommitUserNum: weeks.planCommitUserNum,
          dayCommitUserNum: day.dayCommitUserNum
        })
      },
      /**
       * 回到今天
       */
      backToday() {
        const nowYearMonth = `${this.nowDate.year}-${this.nowDate.month}`
        const date = this.cale.getDate(new Date())
        const todayYearMonth = `${date.year}-${date.month}`

        this.init(date.fullDate)

        if (nowYearMonth !== todayYearMonth) {
          this.monthSwitch()
        }

        this.change()
      },
      /**
       * 上个月
       */
      pre() {
        const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
        this.setDate(preDate)
        this.monthSwitch()

      },
      /**
       * 下个月
       */
      next() {
        const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
        this.setDate(nextDate)
        this.monthSwitch()
      },
      /**
       * 设置日期
       * @param {Object} date
       */
      setDate(date) {
        this.cale.setDate(date)
        this.weeks = this.cale.weeks
        this.nowDate = this.cale.getInfo(date)
      }
    }
  }
</script>

<style lang="scss" scoped>
  $uni-bg-color-mask: rgba($color: #000000, $alpha: 0.4);
  $uni-border-color: #EDEDED;
  $uni-text-color: #111;
  $uni-bg-color-hover: #f1f1f1;
  $uni-font-size-base: 34rpx;
  $uni-text-color-placeholder: #808080;
  $uni-color-subtitle: #555555;
  $uni-text-color-grey: #999;

  .uni-calendar {
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: column;
  }

  .uni-calendar__mask {
    position: fixed;
    bottom: 0;
    top: 0;
    left: 0;
    right: 0;
    background-color: $uni-bg-color-mask;
    transition-property: opacity;
    transition-duration: 0.3s;
    opacity: 0;
    /* #ifndef APP-NVUE */
    z-index: 99;
    /* #endif */
  }

  .uni-calendar--mask-show {
    opacity: 1
  }

  .uni-calendar--fixed {
    position: fixed;
    /* #ifdef APP-NVUE */
    bottom: 0;
    /* #endif */
    left: 0;
    right: 0;
    transition-property: transform;
    transition-duration: 0.3s;
    transform: translateY(460px);
    /* #ifndef APP-NVUE */
    bottom: calc(var(--window-bottom));
    z-index: 99;
    /* #endif */
  }

  .uni-calendar--ani-show {
    transform: translateY(0);
  }

  .uni-calendar__content {
    background-color: #fff;
  }

  .uni-calendar__header {
    position: relative;
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: row;
    justify-content: center;
    align-items: center;
    height: 50px;
    border-bottom-color: $uni-border-color;
    border-bottom-style: solid;
    border-bottom-width: 1px;
  }

  .uni-calendar--fixed-top {
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: row;
    justify-content: space-between;
    border-top-color: $uni-border-color;
    border-top-style: solid;
    border-top-width: 1px;
  }

  .uni-calendar--fixed-width {
    width: 50px;
  }


  .uni-calendar__backtoday {
    position: absolute;
    right: 0;
    top: 25rpx;
    padding: 0 5px;
    padding-left: 10px;
    height: 25px;
    line-height: 25px;
    font-size: 13px;
    border-top-left-radius: 25px;
    border-bottom-left-radius: 25px;
    color: $uni-text-color;
    background-color: $uni-bg-color-hover;
  }

  .uni-calendar__header-text {
    text-align: center;
    width: 100px;
    font-size: $uni-font-size-base;
    color: $uni-text-color;
    font-weight: bold;
  }

  .uni-calendar__header-btn-box {
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: row;
    align-items: center;
    justify-content: center;
    width: 50px;
    height: 50px;
  }


  .uni-calendar__header-btn {
    width: 11px;
    height: 11px;
    border-left-color: $uni-text-color-placeholder;
    border-left-style: solid;
    border-left-width: 2px;
    border-top-color: $uni-color-subtitle;
    border-top-style: solid;
    border-top-width: 2px;
  }

  .uni-calendar--left {
    transform: rotate(-45deg);
  }

  .uni-calendar--right {
    transform: rotate(135deg);
  }


  .uni-calendar__weeks {
    position: relative;
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: row;
  }

  .uni-calendar__weeks-item {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  .uni-calendar-week-plane {
    font-family: PingFang SC, PingFang SC;
    font-weight: 400;
    font-size: 20rpx;
    color: rgba(28, 37, 58, 0.85);
    width: 94rpx;
    height: 40rpx;
    background: rgba(84, 185, 204, 0.15);
    border-radius: 4rpx 4rpx 4rpx 4rpx;
    line-height: 40rpx;
    text-align: center;
    font-style: normal;
    text-transform: none;
    opacity: 0.8;
  }

  .uni-calendar__weeks-day {
    flex: 1;
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 45px;
    border-bottom-color: #F5F5F5;
    border-bottom-style: solid;
    border-bottom-width: 1px;
  }

  .uni-calendar__weeks-day-text {
    font-size: 15px;
  }

  .uni-calendar__box {
    position: relative;
  }

  .uni-calendar__box-bg {
    /* #ifndef APP-NVUE */
    display: flex;
    /* #endif */
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }

  .uni-calendar__box-bg-text {
    font-size: 200px;
    font-weight: bold;
    color: $uni-text-color-grey;
    opacity: 0.1;
    text-align: center;
    /* #ifndef APP-NVUE */
    line-height: 1;
    /* #endif */
  }

  .uni-calendar-item {
    font-family: PingFang SC, PingFang SC;
    font-weight: 400;
    font-size: 22rpx;
    margin-top: 10rpx;
    color: rgba(28, 37, 58, 0.85);
    width: 94rpx;
    height: 48rpx;
    background: rgba(84, 185, 204, 0.15);
    border-radius: 4rpx 4rpx 4rpx 4rpx;
    line-height: 48rpx;
    text-align: center;
    font-style: normal;
    text-transform: none;
    opacity: 0.8;
  }

  //驳回
  .uni-calendar-item[data-status='3'] {
    background-color: #E5E6EB;
    color: #E02020
  }

  //通过
  .uni-calendar-item[data-status='2'] {
    background-color: #95C6C6;
    color: rgba(28, 37, 58, 0.85);
  }

  //审核中
  .uni-calendar-item[data-status='1'] {
    background-color: #F3E9CC;
    color: rgba(28, 37, 58, 0.85);
  }

  //休假
  .uni-calendar-item[data-status='4'] {
    background-color: #E5E6EB;
    color: #E02020
  }

  //部分
  .uni-calendar-item[data-scan-status='1'] {
    background-color: rgba(179, 230, 229, 0.9);
    font-size: 20rpx;
    color: rgba(28, 37, 58, 0.85);
  }

  //全部
  .uni-calendar-item[data-scan-status='2'] {
    background-color: #95C6C6;
    color: rgba(28, 37, 58, 0.85);
  }

  .plan-bg {
    flex-grow: 1;
    margin: 10rpx;
    height: 52rpx;
    padding-left: 15rpx;
    background: rgba(179, 220, 246, 0.5);
    border-radius: 4rpx 4rpx 4rpx 4rpx;
    font-weight: 400;
    font-size: 24rpx;
    color: #1C253A;
    line-height: 52rpx;
    text-align: left;
    font-style: normal;
    text-transform: none;
  }

  //待审核
  .plan-bg[data-status='0'] {
    background-color: #F3E9CC;
    color: #1C253A
  }

  //通过
  .plan-bg[data-status='1'] {
    background-color: #95C6C6;

    color: rgba(28, 37, 58, 0.85);
  }

  //驳回
  .plan-bg[data-status='2'] {
    background-color: #E5E6EB;
    color: #E02020
  }



  //部分
  .plan-bg[data-scan-status='1'] {
    background-color: rgba(179, 230, 229, 0.9);

    color: rgba(28, 37, 58, 0.85);
  }

  //全部
  .plan-bg[data-scan-status='2'] {
    background-color: #95C6C6;
    color: #E02020
  }
</style>
